﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Threading;
using System.Drawing;
using System.Reflection;
using SplashScreenThreaded;

namespace DiveManager
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Mutex s_Mutex = new Mutex(true, "DiveBaseManager");
            if (s_Mutex.WaitOne(0, false))
            {
                Thread splashthread = new Thread(new ThreadStart(SplashScreen.ShowSplashScreen));
                splashthread.IsBackground = true;
                splashthread.Start();

                SplashScreen.UdpateStatusText("Starte Anwendung...");

                Application.EnableVisualStyles();
                Application.DoEvents();

                if (!new DatabaseTools().checkDatabase())
                {
                    SplashScreen.CloseSplashScreen();
                    System.Windows.Forms.MessageBox.Show("Keine Verbindung zur lokalen Datenbank!",
                                                         "Verbindungsfehler",
                                                         MessageBoxButtons.OK,
                                                         MessageBoxIcon.Error);
                    Environment.Exit(0);
                }

                SplashScreen.UdpateStatusText("Aktualisiere Datenbankschema...");
                //Datenbankschemata abgleichen
                SyncDatabase sdb = new SyncDatabase();
                sdb.Setup();
                sdb.Remove();
                sdb.Setup();

                //Prechecks for the application
                prechecks();

                SplashScreen.CloseSplashScreen();

                //Anmeldebildschirm
                LoginForm login = new LoginForm();
                login.ShowDialog();
                if (login.CorrectPass == true)
                {
                    Environment.SetEnvironmentVariable("username", login.UserName, EnvironmentVariableTarget.Process);
                    string username = Environment.GetEnvironmentVariable("username", EnvironmentVariableTarget.Process);
                    Application.Run(new MainForm());
                    //Application.SetCompatibleTextRenderingDefault(false);
                }
                else
                {
                    Environment.Exit(0);
                }
            }
            else
            {
                MessageBox.Show("Programm wurde bereits gestartet!", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private static void prechecks()
        {
            DiveDatabaseEntities diveDatabase = new DiveDatabaseEntities();
            RightsProvider rp = new RightsProvider();

            SplashScreen.UdpateStatusText("Überprüfe Datenbankverbindung...");
                       
            //Zuerst wird versucht die Remote Datenbank anzusprechen
            //wenn online  -> Synchen
            //wenn offline -> Überprüfung, ob es die aller erste Installation ist, dann verlassen, da zuerst die remote Datenbank angesprochen werden sollte
            //bool DataBaseIsOnline = new DatabaseTools().checkRemoteDatabase();
            //if (DataBaseIsOnline == true)
            //{
            //    SplashScreen.UdpateStatusText("Synchronisiere Datenbanken...");
            //    string text = new SyncDatabase().StartSync();
            //    //Rechte lokal abgleichen

            //    SplashScreen.UdpateStatusText("Gleiche Benutzerrechte ab...");
            //    rp.rechteabgleich();
            //}

            bool DataBaseIsOnline = new DatabaseTools().checkDatabase();

            bool DiveStarExists = new DatabaseTools().UserExists("DiveStar");
            if (DiveStarExists == false)
            {
                if (DataBaseIsOnline) //Allererstes Ausführen des Programms
                {
                    User user = new User();
                    user.ID = Guid.NewGuid();
                    user.Name = "DiveStar";
                    user.Password = new Security().GetMD5Hash("DiveStar");
                    diveDatabase.AddToUser(user);
                    diveDatabase.SaveChanges();

                    rp.rechteabgleich();

                    //string text = new SyncDatabase().StartSync();
                }
                else //keine Remote Datenbank und kein DiveStar Benutzer --> Verlassen der Anwendung
                {
                    System.Windows.Forms.MessageBox.Show("Keine Verbindung zur Remotedatenbank - Diese wird jedoch für die Erstinstallation benötigt!",
                                                         "Verbindungsfehler",
                                                         MessageBoxButtons.OK,
                                                         MessageBoxIcon.Error);
                    Environment.Exit(0);
                }
            }
        }
    }
}
